﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Microsoft.Phone.Controls;
using MoviTiendas.Interfaz;
using MoviTiendas.Logica;
using MoviTiendas.Sensores;
using Microsoft.Devices;
using WP7_Barcode_Library;
using System.Windows.Navigation;

namespace MoviTiendas.Interfaz
{
    public partial class PaginaPrincipal : PhoneApplicationPage, SolicitanteComunicacion
    {
        // ------------------------------------------------------------------------------------
        // Atributos
        // ------------------------------------------------------------------------------------

        /**
         * Lista de celdas, las cuales contienen domicilios('Perfil')
         */
        public List<CeldaDisclosure> celdasDomicilios { get; set; }

        /**
         * Lista de celdas, las cuales contienen barrios ('Barrios')
         */
        public List<CeldaCheck> celdasBarrios1 { get; set; }

        /**
         * Lista de barrios seleccionados ('Barrios')
         */
        public List<Barrio> barriosSe1eccionados1 { get; set; }

        /**
         * Lista de celdas, las cuales contienen listas ('Listas')
         */
        public List<CeldaDisclosure> celdasListas { get; set; }

        /**
         * Lista de celdas, las cuales contienen barrios ('Buscar')
         */
        public List<CeldaCheck> celdasBarrios2 { get; set; }

        /**
         * Lista de barrios seleccionados ('Buscar')
         */
        public List<Barrio> barriosSe1eccionados2 { get; set; }

        /**
         * Lista de celdas, las cuales contienen carritos ('Carritos')
         */
        public List<CeldaDisclosure> celdasCarritos { get; set; }


        // ------------------------------------------------------------------------------------
        // Constructor
        // ------------------------------------------------------------------------------------

        /**
         * Constructor de la clase
         */
        public PaginaPrincipal()
        {
            InitializeComponent();
            Acelerometro acel = new Acelerometro(this);
            this.Name = "Principal";
         //   MessageBox.Show(this.Name);
            // --------------------------------------------------------------------------------
            // Pivot Barrios
            // --------------------------------------------------------------------------------

            celdasBarrios1 = new List<CeldaCheck>();
            barriosSe1eccionados1 = new List<Barrio>();

            celdasBarrios1.Add(new CeldaCheck(this, "Favoritas", 2));
            celdasBarrios1.Add(new CeldaCheck(this, MoviTienda.darInstancia.cliente.tiendasFavoritas, 2));
            celdasBarrios1.Add(new CeldaCheck(this, MoviTienda.darInstancia.cliente.barrio, 2));

            celdasBarrios1.Add(new CeldaCheck(this, "Tiendas cercanas", 2));
            celdasBarrios1.Add(new CeldaCheck(this, new Barrio("Tiendas a 100 metros"), 2));

            celdasBarrios1.Add(new CeldaCheck(this, new Barrio("Tiendas a 500 metros"), 2));

            celdasBarrios1.Add(new CeldaCheck(this, new Barrio("Tiendas a 1000 metros"), 2));            
            
            celdasBarrios1.Add(new CeldaCheck(this, "Todos los barrios", 2));

            foreach (Barrio barrio in MoviTienda.darInstancia.barrios)
                if (!barrio.nombre.Equals(MoviTienda.darInstancia.cliente.barrio.nombre))
                    celdasBarrios1.Add(new CeldaCheck(this, barrio, 2));

            foreach (CeldaCheck celda in celdasBarrios1)
                listBarrios1.Items.Add(celda);

            // --------------------------------------------------------------------------------
            // Pivot Buscar
            // --------------------------------------------------------------------------------

            if (ParametroPaginas.claseObjetivo != null && ParametroPaginas.claseObjetivo.Equals("BarCode"))
            {
                txtPalabra.Text = (String) ParametroPaginas.darParametroConIndice(0);
            }

            celdasBarrios2 = new List<CeldaCheck>();
            barriosSe1eccionados2= new List<Barrio>();

            celdasBarrios2.Add(new CeldaCheck(this, "Favoritas", 3));
            celdasBarrios2.Add(new CeldaCheck(this, MoviTienda.darInstancia.cliente.tiendasFavoritas, 3));
            celdasBarrios2.Add(new CeldaCheck(this, MoviTienda.darInstancia.cliente.barrio, 3));

            celdasBarrios2.Add(new CeldaCheck(this, "Tiendas cercanas", 3));
            celdasBarrios2.Add(new CeldaCheck(this, new Barrio("Tiendas a 100 metros"), 3));

            celdasBarrios2.Add(new CeldaCheck(this, new Barrio("Tiendas a 500 metros"), 3));

            celdasBarrios2.Add(new CeldaCheck(this, new Barrio("Tiendas a 1000 metros"), 3));

            celdasBarrios2.Add(new CeldaCheck(this, "Todos los barrios", 3));

            foreach (Barrio barrio in MoviTienda.darInstancia.barrios)
                if (!barrio.nombre.Equals(MoviTienda.darInstancia.cliente.barrio.nombre))
                    celdasBarrios2.Add(new CeldaCheck(this, barrio, 3));

            foreach (CeldaCheck celda in celdasBarrios2)
                listBarrios2.Items.Add(celda);
        }


        // ------------------------------------------------------------------------------------
        // Métodos generales
        // ------------------------------------------------------------------------------------


        /**
         * Método que se ejecuta cuando se selecciona una celda ('Perfil')
         * @celda - Celda seleccionada por medio de la interfaz gráfica
         */
        public void seleccionarCeldaEnPerfil(CeldaDisclosure celda)
        {
            Carrito carrito = celda.lista as Carrito;
            ParametroPaginas.reiniciarParametros("PaginaInfoCarrito");
            ParametroPaginas.agregarParametro(carrito);
            NavigationService.Navigate(new Uri("/Interfaz/PaginaInfoCarrito.xaml", UriKind.RelativeOrAbsolute));
        }
        /**
         * Método que se ejecuta cuando se selecciona una celda ('Barrios')
         * @celda - Celda seleccionada por medio de la interfaz gráfica
         */
        public void seleccionarCeldaEnBarrios(CeldaCheck celda)
        {
            Barrio b = celda.objeto as Barrio;

            //Si el barrio no está en el arreglo, se agrega
            if (!barriosSe1eccionados1.Contains(celda.objeto as Barrio))
            {
                barriosSe1eccionados1.Add(b);
                celda.seleccionarCelda();
            }

            //Si el barrio está en el arreglo, se elimina
            else
            {
                barriosSe1eccionados1.Remove(b);
                celda.deseleccionarCelda();
            }

            if (barriosSe1eccionados1.Count() > 0)
                btnBuscarEnBarrios.IsEnabled = true;

            else
                btnBuscarEnBarrios.IsEnabled = false;
        }

        /**
         * Método que se ejecuta cuando se selecciona una celda ('Buscar')
         * @celda - Celda seleccionada por medio de la interfaz gráfica
         */
        public void seleccionarCeldaEnBuscar(CeldaCheck celda)
        {
            Barrio b = celda.objeto as Barrio;

            //Si el barrio no está en el arreglo, se agrega
            if (!barriosSe1eccionados2.Contains(celda.objeto as Barrio))
            {
                barriosSe1eccionados2.Add(b);
                celda.seleccionarCelda();
            }

            //Si el barrio está en el arreglo, se elimina
            else
            {
                barriosSe1eccionados2.Remove(b);
                celda.deseleccionarCelda();
            }

            if (barriosSe1eccionados2.Count() > 0)
                btnBuscarPalabraClave.IsEnabled = true;

            else
                btnBuscarPalabraClave.IsEnabled = false;
        }

         /**
         * Método que se ejecuta cuando se selecciona una celda ('Listas')
         * @celda - Celda seleccionada por medio de la interfaz gráfica
         */
        public void seleccionarCeldaEnListas(CeldaDisclosure celda)
        {
            Lista lista = celda.lista as Lista;
            ParametroPaginas.reiniciarParametros("PaginaInfoLista");
            ParametroPaginas.agregarParametro(lista);
            NavigationService.Navigate(new Uri("/Interfaz/PaginaInfoLista.xaml", UriKind.RelativeOrAbsolute));
        }

        /**
         * Método que se ejecuta cuando se selecciona una celda ('Carritos')
         * @celda - Celda seleccionada por medio de la interfaz gráfica
         */
        public void seleccionarCeldaEnCarritos(CeldaDisclosure celda)
        {
            Carrito carrito = celda.lista as Carrito;
            ParametroPaginas.reiniciarParametros("PaginaInfoCarrito");
            ParametroPaginas.agregarParametro(carrito);
            NavigationService.Navigate(new Uri("/Interfaz/PaginaInfoCarrito.xaml", UriKind.RelativeOrAbsolute));
        }

        // ------------------------------------------------------------------------------------
        // Métodos manejadores de eventos
        // ------------------------------------------------------------------------------------

        /**
         * Maneja el evento en el que se oprime el botón btnEditarPerfil
         * @sender - Objeto que envía el evento
         * @e - Evento
         */
        private void btnEditarPerfil_Click(object sender, RoutedEventArgs e)
        {
            NavigationService.Navigate(new Uri("/Interfaz/PaginaEditarPerfil.xaml", UriKind.RelativeOrAbsolute));
        }

        /**
         * Maneja el evento en el que se oprime el botón btnBuscarEnBarrios
         * @sender - Objeto que envía el evento
         * @e - Evento
         */
        private void btnBuscarEnBarrios_Click(object sender, RoutedEventArgs e)
        {
            ParametroPaginas.reiniciarParametros("PaginaTiendas");
            ParametroPaginas.agregarParametro(barriosSe1eccionados1);
            NavigationService.Navigate(new Uri("/Interfaz/PaginaTiendas.xaml", UriKind.RelativeOrAbsolute));
        }

        /**
         * Maneja el evento en el que se oprime el botón btnCamara
         * @sender - Objeto que envía el evento
         * 0@e - Evento
         */
        private void btnCamara_Click(object sender, RoutedEventArgs e)
        {
            //rectCamara.Fill = new SolidColorBrush(Colors.Yellow);
            //MessageBox.Show("hola");
           // NavigationService.Navigate(new Uri("/Interfaz/PaginaCamaraBarCode.xaml", UriKind.RelativeOrAbsolute));
            try
            {
                WP7BarcodeManager.ScanMode = com.google.zxing.BarcodeFormat.UPC_EAN;

                if (false == true) //Use Barcode Sample Chooser "Task" if bypass camera setting is active (Emulator/demo mode)
                {
                    //  NavigationService.Navigating += new NavigatingCancelEventHandler(NavigationService_Navigating);
                    //  NavigationService.Navigate(BarcodeSampleItemManager.BarcodeChooserURI); //Navigate to barcode chooser page located in WP7_Barcode_Library.WP7Code
                }
                else //Use BarcodeManager to start camera and scan image
                {
                    WP7BarcodeManager.ScanBarcode(BarcodeResults_Finished); //Provide callback method
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error processing image.");
            }
        }

        public void BarcodeResults_Finished(BarcodeCaptureResult BCResults)
        {
            try
            {
                if (WP7BarcodeManager.LastCaptureResults.BarcodeImage != null)
                {
                    // imgCapture.Source = WP7BarcodeManager.LastCaptureResults.BarcodeImage; //Display image

                }
                else
                {
                    //No image captured
                }
                //if (BCResults.Result == BarcodeResult.Success)
                if (BCResults != null && BCResults.BarcodeText != null)
                {
                    String codigo = BCResults.BarcodeText; //Use results
                   // txtPalabra.Text = codigo;
                    Comunicacion.Comunicacion comu = new Comunicacion.Comunicacion(this);
                    comu.buscarCodigoDeBarras(codigo);
                }
                else
                {
                    MessageBox.Show(BCResults.ErrorMessage);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(String.Format("Barcode Processing Error: {0}", ex.Message));
            }

        }

        public void actualizarPalabraBusqueda(String palabra)
        {
            if (palabra == null)
                MessageBox.Show("No se encontró el producto", "Oops!", MessageBoxButton.OK);
            else
                txtPalabra.Text = palabra;
        }
        /**
         * Maneja el evento en el que se oprime el botón btnAgregarLista
         * @sender - Objeto que envía el evento
         * @e - Evento
         */
        private void btnAgregarLista_Click(object sender, RoutedEventArgs e)
        {
            NavigationService.Navigate(new Uri("/Interfaz/PaginaCrearLista.xaml", UriKind.RelativeOrAbsolute));
        }

        /**
         * Maneja el evento en el que se oprime el botón btnBuscarPalabraClave
         * @sender - Objeto que envía el evento
         * @e - Evento
         */
        private void btnBuscarPalabraClave_Click(object sender, RoutedEventArgs e)
        {
            if (txtPalabra.Text.Length == 0)
                MessageBox.Show("Por favor escriba una palabra", "Texto vacío", MessageBoxButton.OK);
            else
            {
                Comunicacion.Comunicacion comu = new Comunicacion.Comunicacion(this);
                comu.buscarPorPalabaraClave(barriosSe1eccionados2, txtPalabra.Text);
            }            
        }

        /**
         * Maneja el evento en el que se navega a la página
         * @e - Evento
         */
        protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
        {
            lblNombre.Text = MoviTienda.darInstancia.cliente.nombre;
            lblDireccion.Text = MoviTienda.darInstancia.cliente.direccion;
            lblBarrio.Text = MoviTienda.darInstancia.cliente.barrio.nombre;

            celdasDomicilios = new List<CeldaDisclosure>();
            listDomicilios.Items.Clear();
            foreach (Carrito carrito in MoviTienda.darInstancia.cliente.historial)
                celdasDomicilios.Add(new CeldaDisclosure(this, carrito.tienda.nombre, carrito, 1));

            foreach (CeldaDisclosure celda in celdasDomicilios)
                listDomicilios.Items.Add(celda);


            celdasListas = new List<CeldaDisclosure>();
            listListas.Items.Clear();
            foreach (Lista lista in MoviTienda.darInstancia.cliente.listas)
                celdasListas.Add(new CeldaDisclosure(this, lista.nombre, lista, 4));

            foreach (CeldaDisclosure celda in celdasListas)
                listListas.Items.Add(celda);


            celdasCarritos = new List<CeldaDisclosure>();
            listCarritos.Items.Clear();
            foreach (Carrito carrito in MoviTienda.darInstancia.cliente.carritos)
                celdasCarritos.Add(new CeldaDisclosure(this, carrito.tienda.nombre, carrito, 5));

            foreach (CeldaDisclosure celda in celdasCarritos)
                listCarritos.Items.Add(celda);
        }

        /**
         * Maneja el evento en el que se oprime el botón Back
         * @e - Evento
         */
        protected override void OnBackKeyPress(System.ComponentModel.CancelEventArgs e)
        {
            e.Cancel = true;
        }


         /**
         * Este método es llamado por la clase Comunicacion, una vez termine la carga del mundo.
         * Acá se debe cargar la interfaz con garantia de que el mundo ya tiene la información solicitada.
         */
        public void notificarCargaDeDatos()
        {

        }

        /**
         * Este método es llamado por la clase Comunicacion, una vez termine la busqueda por palabra clave.
         * Acá se deben realizar las acciones necesarias al obtener los resultados de la busqueda.
         */
        public void recibirResultadosBusquedaPalabraClave(List<Producto> resultados)
        {
            if (resultados.Count == 0)
            {
                MessageBox.Show("Su búsqueda no arrojó ningún resultado", "Búsqueda", MessageBoxButton.OK);
                return;
            }
            ParametroPaginas.reiniciarParametros("PaginaProductosBusqueda");
            ParametroPaginas.agregarParametro(resultados);
            NavigationService.Navigate(new Uri("/Interfaz/PaginaProductosBusqueda.xaml", UriKind.RelativeOrAbsolute));
        }




    }
}